#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void handler(int sig)
{
    return;  //使得退出pause()
}

/*
    从共享内存读
    另一个进程写
*/
int main(int argc, char *argv[])
{
    signal(SIGUSR2, handler);
    int shmid;
    int key;
    char *buff;
    int other_pid;

    //打开共享内存
    key = ftok(".", 1);
    shmid = shmget(key, 128, IPC_CREAT | 0777);

    //将内核中的共享内存映射到用户空间，第二个参数NULL表示系统自动分配用户空间地址
    //第三个参数0表示可读写
    buff = (char*)shmat(shmid, NULL, 0);
    if(buff == NULL){
        printf("映射共享内存失败\n");
        return -2;
    }

    //第一次从共享内存中读数据，读取到的是另一个进程的PID
    other_pid = atoi(buff);
    printf("已获取PID, %d\n", other_pid);

    //向共享内存中写入自己的进程ID
    sprintf(buff, "%d", getpid());
    //发出信号
    kill(other_pid, SIGUSR1);


    while(1)
    {
        //睡眠，等待另一个进程发送SIGUSER2信号
        pause();
        printf("从共享内存读出数据：%s",buff);
        //发出信号
        kill(other_pid, SIGUSR1);
    }

    return 0;
} 




